--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/electron/shellPathGuard.test.js 514005e995d29a03df041d5a9772fa61b1664294 (514005e9) Text, 3.15 KB
Ta5d6ff"use strict"Tb4b4b4;
Tff7b72import Te6edf3fs Tff7b72from Ta5d6ff"fs"Tb4b4b4;
Tff7b72import Te6edf3os Tff7b72from Ta5d6ff"os"Tb4b4b4;
Tff7b72import Te6edf3path Tff7b72from Ta5d6ff"path"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3it Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3isAllowedShellPath Tb4b4b4} Tff7b72from Ta5d6ff"../../electron/shellPathGuard.js"Tb4b4b4;
Tff7b72function Te6edf3fakeAppTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3home Tff7b72= Te6edf3osTb4b4b4.Te6edf3homedirTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3getPathTb4b4b4(Te6edf3nameTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3name Tff7b72=== Ta5d6ff"userData"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3homeTb4b4b4, Ta5d6ff".meshchatx-test-userdata"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3name Tff7b72=== Ta5d6ff"temp"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3osTb4b4b4.Te6edf3tmpdirTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3name Tff7b72=== Ta5d6ff"downloads"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3homeTb4b4b4, Ta5d6ff"Downloads"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3name Tff7b72=== Ta5d6ff"documents"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3homeTb4b4b4, Ta5d6ff"Documents"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6ffunexpected getPath Tffd700${Te6edf3nameTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Te6edf3describeTb4b4b4(Ta5d6ff"shellPathGuard"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3home Tff7b72= Te6edf3osTb4b4b4.Te6edf3homedirTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3storage Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3homeTb4b4b4, Ta5d6ff".reticulum-meshchatx"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3reticulum Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3homeTb4b4b4, Ta5d6ff".reticulum"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ctx Tff7b72= Tb4b4b4{
Te6edf3appTff7b72: Te6edf3fakeAppTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3getDefaultStorageDirTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3storageTb4b4b4,
Te6edf3getDefaultReticulumConfigDirTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3reticulumTb4b4b4,
Te6edf3getUserProvidedArgumentsTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"allows paths under default storage"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3p Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3storageTb4b4b4, Ta5d6ff"rncp_received"Tb4b4b4, Ta5d6ff"file.bin"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3isAllowedShellPathTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"allows paired legacy storage directory"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3legacy Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3homeTb4b4b4, Ta5d6ff".reticulum-meshchat"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3p Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3legacyTb4b4b4, Ta5d6ff"identities"Tb4b4b4, Ta5d6ff"abc"Tb4b4b4, Ta5d6ff"database.db"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3isAllowedShellPathTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"denies paths outside allowed roots"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3p Tff7b72= Te6edf3processTb4b4b4.Te6edf3platform Tff7b72=== Ta5d6ff"win32" Tff7b72? Ta5d6ff"C:\\Windows\\System32\\drivers\\etc\\hosts" Tff7b72: Ta5d6ff"/etc/passwd"Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3isAllowedShellPathTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"allows temp directory files"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3p Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3osTb4b4b4.Te6edf3tmpdirTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff`Ta5d6ffmeshchatx-shell-guard-Tffd700${Te6edf3processTb4b4b4.Te6edf3pidTffd700}Ta5d6ff.txtTa5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3fsTb4b4b4.Te6edf3writeFileSyncTb4b4b4(Te6edf3pTb4b4b4, Ta5d6ff"x"Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3isAllowedShellPathTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Te6edf3fsTb4b4b4.Te6edf3unlinkSyncTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"fuzz: paths under default storage stay allowed"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff200Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3seg Tff7b72= Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Tb4b4b4{ Te6edf3lengthTff7b72: T79c0ff10 Tb4b4b4}Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657StringTb4b4b4.Te6edf3fromCharCodeTb4b4b4(Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff94Tb4b4b4) Tff7b72+ T79c0ff33Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(
Ta5d6ff""
Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3p Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3storageTb4b4b4, Ta5d6ff"fuzz-shell"Tb4b4b4, Te6edf3segTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3isAllowedShellPathTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3isAllowedShellPathTb4b4b4(Te6edf3pTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"fuzz: random absolute-looking paths return boolean without throw"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff200Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3s Tff7b72= Te6edf3processTb4b4b4.Te6edf3platform Tff7b72=== Ta5d6ff"win32" Tff7b72? Ta5d6ff"C:\\" Tff7b72: Ta5d6ff"/"Tb4b4b4;
Tff7b72const Te6edf3n Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff24Tb4b4b4) Tff7b72+ T79c0ff4Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3nTb4b4b4; Te6edf3jTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72+= Tffa657StringTb4b4b4.Te6edf3fromCharCodeTb4b4b4(Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff96Tb4b4b4) Tff7b72+ T79c0ff32Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3isAllowedShellPathTb4b4b4(Te6edf3sTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72typeof Te6edf3isAllowedShellPathTb4b4b4(Te6edf3sTb4b4b4, Te6edf3ctxTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"boolean"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────